﻿#region Copyright

// The contents of this file are subject to the Mozilla Public License
//  Version 1.1 (the "License"); you may not use this file except in compliance
//  with the License. You may obtain a copy of the License at
//  
//  http://www.mozilla.org/MPL/
//  
//  Software distributed under the License is distributed on an "AS IS"
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//  License for the specific language governing rights and limitations under 
//  the License.
//  
//  The Initial Developer of the Original Code is Robert Smyth.
//  Portions created by Robert Smyth are Copyright (C) 2008.
//  
//  All Rights Reserved.

#endregion

using System.Collections.Generic;


namespace NUnitGrid.Server.Plugins.GridNodesLink
{
    public class GridNodes : IGridNodes, IGridNodeLinkListener
    {
        private readonly List<IGridNode> nodes = new List<IGridNode>();
        private readonly IGridNodeLinkFactory linkFactory;
        private readonly IGridNodesListener listener;
        private readonly IGridNodeFactory nodeFactory;
        private IGridNodesLink listeningLink;

        public GridNodes(IGridNodeLinkFactory linkFactory, IGridNodesListener listener, IGridNodeFactory nodeFactory)
        {
            this.linkFactory = linkFactory;
            this.listener = listener;
            this.nodeFactory = nodeFactory;
        }

        void IGridNodeLinkListener.OnConnect(bool completed)
        {
            var newNode = nodeFactory.Create(listeningLink);
            nodes.Add(newNode);

            listener.OnNodeConnected();
            OpenListeningLink();

            newNode.Start();
        }

        public void Start()
        {
            OpenListeningLink();
        }

        public int Count
        {
            get { return nodes.Count; }
        }

        private void OpenListeningLink()
        {
            listeningLink = linkFactory.Create(this);
            listeningLink.Start();
            listeningLink.ListenForConnection();
        }
    }
}